package com.acoresoft.mybatis.plugins.page;

import java.util.List;

/**
 * Description: 分页
 * @author WallenHeng
 * @date 2014年6月10日 下午3:26:26
 *
 */
public class Page<T> {
	/**
	 * 每页显示数据个数
	 */
	private int pageSize = 10;

	/**
	 * 当前页码
	 */
	private int pageNo = 1;

	/**
	 * 当前分页开始的 第一个序列值 （从0开始）
	 */
	private int offset = 0;
	/**
	 * 最大页码（总的页面个数）
	 */
	private long totalPages;

	/**
	 * 数据总的个数
	 */
	private long count;
	/**
	 * 分页数据列表
	 */
	private List<T> datas;
	
	/**
	 * default
	 */
	public Page() {

	}

	/**
	 * @param
	 */
	public void setPageSize(int pageSize) {
		if (pageSize <= 0) {
			this.pageSize = 1;
		} else {
			this.pageSize = pageSize;
		}

	}

	/**
	 * @param
	 */
	public void setOffset(int offset) {
		if (offset < 0) {
			this.offset = 0;
		} else {
			this.offset = offset;
		}
	}

	/**
	 * 设置总的数据个数 同时完成分页相关参数的运算。
	 * 
	 * @param count
	 *  总的数据个数
	 */
	public void setCount(long count) {
		if (count <= 0) {
			this.count = 0;
			this.totalPages = 1;
		} else {
			this.count = count;
			this.totalPages = this.count % this.pageSize == 0 ? this.count
					/ this.pageSize : this.count / this.pageSize + 1;
			this.pageNo = this.offset / this.pageSize + 1;
		}
	}

	/**
	 * 理论上理想的offset最大值
	 */
	public int getMaxOffset() {
		if (this.totalPages <= 0) {
			return this.offset;
		}
		return (int) ((this.totalPages - 1) * this.pageSize);
	}

	/**
	 * 
	 * @return 数据集合
	 */
	public List<T> getDatas() {
		return datas;
	}

	/**
	 * 
	 * @param 设置数据集合
	 */
	public void setDatas(List<T> datas) {
		this.datas = datas;
	}

	/**
	 * 
	 * @return 当前页
	 */
	public int getPageNo() {
		return this.pageNo;
	}

	public void setPageNo(int pageNo) {
		this.pageNo = pageNo;
	}
	
	/**
	 * 
	 * @return 下一页
	 */
	public int getNextPageNo() {

		if (pageNo == totalPages) {
			return pageNo;
		} else {
			return pageNo + 1;
		}
	}

	/**
	 * 
	 * @return 最后一页
	 */
	public int getLastPageNo() {
		if (pageNo == 1) {
			return 1;
		} else {
			return pageNo - 1;
		}
	}

	/**
	 * 得到分页的第一个序列值
	 */
	public int getOffset() {
		int max = this.getMaxOffset();
		if (this.offset > max) {
			this.offset = max;
		}
		return offset;
	}

	/**
	 * @return 总页数
	 */
	public long getTotalPages() {
		return totalPages;
	}

	/**
	 * 
	 * @return 页数
	 */
	public long getCount() {
		return count;
	}

	/**
	 * 
	 * @return 一页大小
	 */
	public int getPageSize() {
		return pageSize;
	}

	/**
	 * 
	 * 是否还有上一页.
	 */
	public boolean isHasLast() {
		return (pageNo - 1 >= 1);
	}

	/**
	 * 
	 * 是否还有上一页.
	 */
	public boolean isHasNext() {
		return (pageNo + 1 <= totalPages);
	}

	@Override
	public String toString() {
		return "[pageSize:" + this.pageSize + "; pageNo:" + this.pageNo
				+ "; count:" + this.count + "; offset:" + this.offset
				+ "; totalPages:" + this.totalPages + "; getLastPageNo:"
				+ this.getLastPageNo() + "; getNextPageNo:"
				+ this.getNextPageNo() + "; isHasLast:" + this.isHasLast()
				+ "; isHasNext:" + this.isHasNext() + "]";
	}
}
